#include <REGX52.H>

// 数码管显示缓存区
unsigned char nixie_buf[] = {0, 10, 10, 10, 10, 10, 10, 10, 10};

// 数字0-9的显示（P0的段选）,0x00不显示，0x40表示 -
unsigned char arr[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x00, 0x40};

/** @bref 设置显示缓存区
	* @param location 要显示的位置，范围：1-8
	* @param number 要显示的数字，范围：段码表索引
  * @retval 无
  */
void nixieTube_setBuf(unsigned char location, number)
{
	nixie_buf[location] = number;
}

/** @bref 数码管扫描显示（LED的位置、要显示的数字）
	* @param location 要显示的位置，范围：1-8
	* @param number 要显示的数字，范围：段码表索引
  * @retval
  */
void nixieTube_scan(unsigned char location, number)
{
	// 段码清零，消影
	P0 = 0x00;
	
	// LED灯的选择，从左到右分别是LED8--LED1（P2的位选）
	switch(location)
	{
		case 1:
			P2_4 = 1; P2_3 = 1; P2_2 = 1; break;
		case 2:
			P2_4 = 1; P2_3 = 1; P2_2 = 0; break;
		case 3:
			P2_4 = 1; P2_3 = 0; P2_2 = 1; break;
		case 4:
			P2_4 = 1; P2_3 = 0; P2_2 = 0; break;
		case 5:
			P2_4 = 0; P2_3 = 1; P2_2 = 1; break;
		case 6:
			P2_4 = 0; P2_3 = 1; P2_2 = 0; break;
		case 7:
			P2_4 = 0; P2_3 = 0; P2_2 = 1; break;
		case 8:
			P2_4 = 0; P2_3 = 0; P2_2 = 0; break;
	}
	
	// 段码输出
	P0 = arr[number];
}

/** @bref 数码管驱动函数，在定时器中断中调用
  * @param 无
  * @retval 无
  */
void nixieTube_loop()
{
	static unsigned char i = 1;
	nixieTube_scan(i, nixie_buf[i]);
	i++;
	if(i > 8)
	{
		i = 1;
	}
}